<?php
//这里用人作为例子，人想要达到一些目的的时候,需要有行动才会产生不同的效果
//行为这个接口方法是不会变的，这个方法很稳定

#给人定义了一个行为
interface PersonAction{
    public function actionDo();
}


//学习的行为  扩展人的行为
//study programme
class studyAction implements PersonAction{
    public function actionDo()
    {
        echo 'study programme',"\r\n";
    }
}

//成为大牛的行为  扩展人的行为
//成为 bigCow
class bigCowAction implements PersonAction{
    public function actionDo()
    {
        // TODO: Implement actionDo() method.
        echo 'become bigRow',"\r\n";
    }
}

//脑子不断的接受新的知识，脑子就是一个 “调度管理器” 接受新的知识就是一个学习的过程，成为大牛就是一个结果
class brainTake{
    //行为
    private $actionName;
    public function __construct()
    {
    }

    //脑子接受之后会有对应的结果
    //study是一个事件  become bigCow 也是一个事件
    public function callback(event $event){
        //这个行为会有事件，因为这个行为做了才会有对应的结果
        $this->actionName = $event->movement();
        //如果当前的行为名字是属于我这个人的，那么我就能做对应的动作，达到对应的结果
        if($this->actionName instanceof PersonAction){
            $this->actionName->actionDo();
        }
    }
}

class event{
    private $event_name;
    //初始化行为名称

    public function __construct($event_name)
    {
        $this->event_name = $event_name;
    }
    //这边要返回两个行为的类的实例化对象，因为要做出对应的行为
    public function movement(){
        switch ($this->event_name){
            case 'study':
                return new studyAction();
                break;
            case 'bigCow':
                return new bigCowAction();
                break;
        }
    }
}


//定义一个人类
class LiuHouse{
    //做一些事情
    public function doSomthing(){
        $brainTake = new brainTake();
        //先进行学习
        $brainTake->callback(new event('study'));
        //再成为大牛
        $brainTake->callback(new event('bigCow'));
    }
}

$liuhouse = new LiuHouse();
$liuhouse->doSomthing();








